package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.CommonTableModel;
import de.e2it3t.schulverwaltung.data.SchuelerTable;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * Ansicht der Schüler. <br>
 * <br>
 * Die View zeigt eine Liste mit allen Schülern und bietet die Möglichkeit
 * Schüler hinzuzufügen, zu löschen und zu bearbeiten.<br>
 * <br>
 * Tip: Die Liste erlaubt eine Selektierung mehrerer Schüler mit STRG und / oder
 * Shift.
 * 
 * @author Viktor Reiser
 */
public class SchuelerView extends JPanel implements AppView {

    private JTable schuelerTable;
    private JButton addButton;
    private JButton editButton;
    private JButton deleteButton;
    
    private List<SchuelerTable> schuelerData;
    
    
    public SchuelerView() {
        setupSchuelerTable();
        setupAddButton();
        setupDeleteButton();
        setupEditButton();
        
        setLayout(new FormLayout(
                "fill:pref:grow, pref, 5px, pref, 5px, pref, 5px, pref",
                "pref, 5px, fill:pref:grow"));
        CellConstraints cc = new CellConstraints();
        
        add(addButton, cc.xy(2, 1));
        add(editButton, cc.xy(4, 1));
        add(deleteButton, cc.xy(6, 1));
        add(App.createInfoButton("<html>Die Schüleransicht listet alle vorhandenen Schüler aller Klassen. "
                        + "Man kann Schüler hinzufügen, bearbeiten oder löschen.", 330, 80), cc.xy(8, 1));
        add(new JScrollPane(schuelerTable), cc.xywh(1, 3, 8, 1));
    }
    
    private void setupSchuelerTable() {
        schuelerTable = new JTable();
        // Liste soll den kompletten, zur Verfügung stehenden Platz nutzen
        schuelerTable.setFillsViewportHeight(true);
        // Hack: wir brauchen eine gewünschte Größe, damit die Liste
        // gescrollt werden kann, wenn sie zu viele Einträge hat
        schuelerTable.setPreferredScrollableViewportSize(new Dimension(50, 50));
        // wir wollen die Liste durch Klick auf die Header sortieren können
        schuelerTable.setAutoCreateRowSorter(true);
        schuelerTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // Buttons ensprechend der Selektion de-/aktivieren
                deleteButton.setEnabled(schuelerTable.getSelectedRowCount() != 0);
                editButton.setEnabled(schuelerTable.getSelectedRowCount() == 1);
                
                // Doppelklick
                if (e.getClickCount() == 2) {
                    editSelectedSchueler();
                }
            }
        });
    }

    private void setupAddButton() {
        addButton = new JButton("Hinzufügen");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                // Neuer Schüler
                new SchuelerDialog(SchuelerView.this).setVisible(true);
            }
        });
    }
    
    private void setupDeleteButton() {
        deleteButton = new JButton("Löschen");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                deleteSelectedSchueler();
            }
        });
    }
    
    private void setupEditButton() {
        editButton = new JButton("Bearbeiten");
        editButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                editSelectedSchueler();
            }
        });
    }
    
    
    /**
     * Selektierten Schüler bearbeiten (wenn genau einer selektiert ist).
     */
    private void editSelectedSchueler() {
        if (schuelerTable.getSelectedRowCount() != 1) {
            return;
        }
        
        int schuelerId = schuelerData.get(
                schuelerTable.convertRowIndexToModel(
                schuelerTable.getSelectedRow())).getId();

        new SchuelerDialog(this, schuelerId).setVisible(true);
    }
    
    /**
     * Selektierte Schüler löschen (wenn welche selektiert sind). <br>
     * <br>
     * Es wird nachgefragt, ob wirklich gelöscht werden soll.
     */
    private void deleteSelectedSchueler() {
        if (schuelerTable.getSelectedRowCount() == 0) {
            return;
        }
        
        int schuelerCount = schuelerTable.getSelectedRowCount();
        int result = JOptionPane.showConfirmDialog(
                null,
                "Wollen sie wirklich "
                + (schuelerCount == 1 ? "den gewählten" : schuelerCount + "")
                + " Schüler löschen?",
                "Schüler löschen?",
                JOptionPane.YES_NO_OPTION, 
                JOptionPane.QUESTION_MESSAGE);
                
       if (result == JOptionPane.YES_OPTION) {
            for (int index : schuelerTable.getSelectedRows()) {
                App.getDatabase().deleteSchueler(schuelerData.get(
                        schuelerTable.convertRowIndexToModel(index)).getId());
            }
            
            refreshView();
        }
    }
    
    
    @Override
    public void refreshView() {
        editButton.setEnabled(false);
        deleteButton.setEnabled(false);
        
        schuelerData = App.getDatabase().getSchuelerTable();
        schuelerTable.setModel(new CommonTableModel(
                schuelerData,
                new String[] {"nachname", "vorname", "klasse"},
                new String[] {"Nachname", "Vorname", "Klasse"}));
        schuelerTable.getRowSorter().toggleSortOrder(0);
        
        boolean hasKlassen = App.getDatabase().hasKlassen();
        
        addButton.setEnabled(hasKlassen);
        addButton.setToolTipText(hasKlassen ? null : "Keine Klassen vorhanden");
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public String getViewName() {
        return "Schüler";
    }
}
